package com.Dec_Five;

import java.util.Stack;

/**
 * 1106. 解析布尔表达式
 * 给你一个以字符串形式表述的 布尔表达式（boolean） expression，返回该式的运算结果。
 *
 * 有效的表达式需遵循以下约定：
 *
 * "t"，运算结果为 True
 * "f"，运算结果为 False
 * "!(expr)"，运算过程为对内部表达式 expr 进行逻辑 非的运算（NOT）
 * "&(expr1,expr2,...)"，运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 与的运算（AND）
 * "|(expr1,expr2,...)"，运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 或的运算（OR）
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/parsing-a-boolean-expression
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 2022/11/05 09:09
 */

public class Solution1106 {

    public boolean parseBoolExpr(String expression) {
        Stack<Character> stack=new Stack<>();
        StringBuilder temp= new StringBuilder();
        for (int i = 0; i < expression.length(); i++) {
            char c=expression.charAt(i);
            if (c==')')
            {
                while (stack.peek()!='(')
                {
                    temp.append(stack.pop());
                }
                stack.pop();
                stack.push(isBool(stack.pop(), temp.toString()));
            }else if (c!=',')
            {
                stack.push(c);
            }
            temp = new StringBuilder();
        }
        return stack.peek() == 't';
    }

    public char isBool(char op,String temp){
        if (op=='!')
        {
            if (temp.equals("t"))
            {
                return 'f';
            }else
            {
                return 't';
            }
        }else if (op=='&')
        {
            if (temp.indexOf('f')!=-1)
            {
                return 'f';
            }else
            {
                return 't';
            }
        }else if (op=='|')
        {
            if (temp.indexOf('t')!=-1)
            {
                return 't';
            }else
            {
                return 'f';
            }
        }
        return 'f';
    }

    public static void main(String[] args) {
        Solution1106 solution1106=new Solution1106();
        System.out.println(solution1106.parseBoolExpr("|(&(t,f,t),!(t))"));
    }

}
